<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        h3{
            height: 500px;
        }
    </style>
</head>

<body>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
    <h3>滚动</h3>
</body>

</html>

<script>
    // 节流严格算起来应该属于性能优化知识，但实际上遇到的频率相当高，处理不当或者放任不管容易引起浏览器卡死

    // 继续思考，使用防抖方案来处理问题的结果是
    // 如果在限定时间段内，不断触发滚动事件（比如某个用户闲着无聊，按住滚动不断的拖来拖去），只要不停触发，
    // 理论上就永远不会输出当前距离顶部的距离
    // 但是如果产品同学的期望处理方案是：即使用户不断拖动滚动条，也能在某个时间间隔之后给出反馈呢？
    // 其实很简单：我们可以设计一种类似控制阀门一样定期开放的函数，也就是让函数执行一次后，在某个时间段内暂时失效，
    // 过了这段时间后重新激活（类似于技能冷却时间）
    // 效果：如果短时间内大量触发同一事件，那么在函数执行一次之后，该函数在指定的时间期限内不再工作，值至过了这段时间才重新生效

    function throttle(fun,delay){
        var timer = true
        return function(){
            if(!timer){
                return false;
            }
            timer = false;
            setTimeout(function(){
                fun();
                timer = true;
            },delay);
        }
    }

    window.onscroll = throttle(scrollHandler,2000)

    function scrollHandler() {
        var scrollTop = document.documentElement.scrollTop;
        console.log("滚动了", scrollTop)
    }

    //如果一直拖着滚动条进行滚动，那么会以2000ms的时间间隔，持续输出当前位置和顶部的距离
    // 讲完了这两个技巧，下面介绍一下平时研发中通常遇到的场景：
    // 1、搜索框input事件，例如要支持输入实现搜索可以使用节流方案（间隔一段时间就必须查询相关内容）
    //或者实现输入间隔大于某个值，就当做用户输入完成，然后开始搜索，具体使用哪种方案要看业务需求
    // 2、页面resize事件，常见于需要做页面适配的时候，需要根据最终呈现的页面情况进行dome渲染
    // （这种情形一般是使用防抖，因为只需要判断最后一次变化情况）
</script>